<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        aim:    1.学习Object.assign()方法
     */

    /*
        Object.assign()
            - 接收一个目标对象和n个源对象
            - 然后将每个源对象中可枚举(Object.propertyIsEnumerable()返回 true) 和自有(Object.hasOwnProperty()返回 true)属性复制到目标对象
            - 以字符串和符号为键的属性 会被复制
            - 对每个符合条件的属性，这个方法会使用源对象上的[[Get]]取得属性的值，然后使用目标 对象上的[[Set]]设置属性的值
            - 是浅复制,只会复制对象的引用
            - 错误处理:没有回滚,复制到哪儿,出错后,就会复制到出错前的地方的值
     */

    /*
        1.实践
            -说明,后面的对象会赋值到dest中,并且返回的就是dest本身
     */
    let dest = {}, src = {id: 'src'}, result;
    result = Object.assign(dest, src)
    console.log(dest, result, dest === result) // {id:src},{id:src},true


    /*
        2.检测get 和   set
     */

    dest = {
        set a(val) {
            console.log(`dest set ${val}`)
            this.b = val
        }
    };
    src = {
        get a() {
            console.log(`src get`)
            return 'foo'
        }
    }
    Object.assign(dest, src) // src get     dest set foo
    console.log(dest) // {b:'foo'}

</script>
</body>
</html>